package de.tudarmstadt.gdi1.project.cipher.substitution.monoalphabetic;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import de.tudarmstadt.gdi1.project.Charset;
import de.tudarmstadt.gdi1.project.alphabet.Alphabet;
import de.tudarmstadt.gdi1.project.utils.Utils;

public class Utils_IMP implements Utils {


	
	@Override
	public Alphabet shiftAlphabet(Alphabet alphabet, int key) {		
	
		char [] alph = new char[alphabet.size()];
		
		
		/**
		 * 
		 * @author Samir
		 * 
		 * @param key
		 * 				steht für die Verschiebung im Alphabet
		 * 
		 * 
		 * 
		 */
		
	if(key < 0) {  //wenn die Verschiebung unter 0 ist, wird sie solange addiert bis sie über 0 ist
			
			key+= alphabet.size(); }
			
			for(Character chr: alphabet) { 
				
	
			int indexInputAlphabet =	alphabet.getIndex(chr); //Stelle des Buchstaben im Alphabet
				
			int indexOutputAlphabet =	(indexInputAlphabet + key) %alphabet.size(); 	// Die Stelle wird mit dem Schlüssel addiert 
																						// und modulu der Alphabetgröße damit man nicht aus dem Alphabeten fällt
			
			alph [indexOutputAlphabet] = chr;
			}
			
			ArrayList<Character> alphabetlist = new ArrayList<Character>();
		
			for(char chr : alph) {
				
				alphabetlist.add(chr);
			}
			
		return new Charset(alphabetlist);
		
	}

	@Override
	public String toDisplay(String ciphertext) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Map<Integer, List<String>> ngramize(String text, int... lengths) {
		// TODO Auto-generated method stub
		return null;
	}

	

	@Override
	public boolean containsSameCharacters(Alphabet alphabet1, Alphabet alphabet2) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Alphabet randomizeAlphabet(Alphabet alphabet) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Alphabet reverseAlphabet(Alphabet alphabet) {
		LinkedList<Character> realph = new LinkedList<Character>();
		for (char c : alphabet) {
			realph.addFirst(c);
		}
		return new Charset(realph);
	}
	}
